package com.example.lambda;

import org.junit.Test;

import java.util.Comparator;
import java.util.function.Consumer;

/**
 * @author readpage
 * @create 2022-10-22 10:37
 * Lambda表达式的使用
 *
 * 1.举例: (o1, o2) -> Integer.compare(o1, o2);
 * 2.格式:
 *     -> : lambda操作符 或者 箭头操作符
 *     -> 左边: lambda形参列表 (其实就是接口中抽象方法的形参列表)
 *     -> 右边: lambda体 (其实就是重写的抽象方法的方法体)
 * 3.Lambda表达式的使用: (分为6中情况介绍)
 *  总结:
 *  ->左边: lambda形参列表的参数类型可以省略(类型推断); 如果lambda形参列表只有一个参数，其一对()也可以省略的
 *  ->右边: lambda体应该使用一对{}包裹；如果lambda体只有一条执行语句(可能时return语句),可以省略这个一对{}和return
 * 4.Lambda表达式的本质：作为函数式接口的实例
 *
 * 5.如果一个接口中，只声明了一个抽象方法，则此接口就称为函数式接口
 * 匿名实现类表示可以用Lambda表达式来写
 *
 */
public class LambdaTest2 {
    //语法格式一: 无参，无返回值
    @Test
    public void test() {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("hello world!");
            }
        };
        runnable.run();

        System.out.println("***************");
        Runnable r2 = () -> System.out.println("hello world!");
        r2.run();
    }

    //语法格式二: Lambda需要一个参数，但是没有返回值
    @Test
    public void test2() {
        Consumer<String> con = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        con.accept("how ar you?");
        System.out.println("**********************");
        // 数据类型可以省略,因为可由编译器判断得出,称为"类型判断"
        Consumer<String> con2 = s -> System.out.println(s);
        con2.accept("how ar you?");
    }

    //语法格式三: Lambda 需要两个或以上得参数，多条执行语句，并且可以有返回值
    @Test
    public void test3() {
        Comparator<Integer> com1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                return o1.compareTo(o2);
            }
        };
        System.out.println(com1.compare(12, 21));

        System.out.println("**********************");
        Comparator<Integer> com2 = (o1, o2) -> {
            System.out.println(o1);
            System.out.println(o2);
            return o1.compareTo(o2);
        };
        System.out.println(com2.compare(12, 6));
    }

    @Test
    public void test4() {
        MyInterface myInterface = () -> System.out.println("hello world!");
        myInterface.method();
    }

}
